﻿// 930. 和相同的二元子数组.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;
/*
https://leetcode.cn/problems/binary-subarrays-with-sum/description/

给你一个二元数组 nums ，和一个整数 goal ，请你统计并返回有多少个和为 goal 的 非空 子数组。
子数组 是数组的一段连续部分。

示例 1：
输入：nums = [1,0,1,0,1], goal = 2
输出：4
解释：
有 4 个满足题目要求的子数组：[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]

示例 2：
输入：nums = [0,0,0,0,0], goal = 0
输出：15

提示：
1 <= nums.length <= 3 * 104
nums[i] 不是 0 就是 1
0 <= goal <= nums.length
*/

class Solution {
public:
    unordered_map<int, int> mm;
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int presum[30010]; memset(presum, 0, sizeof presum);
        nums.insert(nums.begin(), 0);
        for (int i = 1; i < nums.size(); i++) {
            presum[i] = presum[i - 1] + nums[i];
        }
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            int find =  presum[i] - goal;
            ans += mm[find];
            mm[presum[i]]++;
        }

        return ans;
    }
};


int main()
{
    Solution s;
    vector<int> v{ 0,0,0,0,0 };
    s.numSubarraysWithSum(v,0);


    return 0;
}

 